﻿///////////////////////////////////////////////////////////////////////////////
//
//  This file is part of MathLib.NET.
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//  
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//  
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library;  If not, see 
//  <http://www.gnu.org/licenses/>.
//
///////////////////////////////////////////////////////////////////////////////

using ILNumerics;

namespace MathLib
{
    /// <summary>
    /// Numeric value interface.
    /// </summary>
    interface INumber<T>
    {
        // Binary operators
        T Add(T a, T b);
        T Sub(T a, T b);
        T Mul(T a, T b);
        T Div(T a, T b);
        T Pow(T a, T b);

        // Unary operators
        T Neg(T a);
        T Abs(T a);

        // Comparators
        bool Lt(T a, T b);
        bool Gt(T a, T b);
        bool Le(T a, T b);
        bool Ge(T a, T b);
        bool Eq(T a, T b);
        bool Ne(T a, T b);

        // Assignment operators
        T FromComplex(complex a);
        T FromFComplex(fcomplex a);
        T FromDouble(double a);
        T FromFloat(float a);
        T FromInt(int a);
        T FromUInt(uint a);
    }
}
